package cn.lxh.blog.service.impl;


import cn.lxh.blog.domain.Param;
import cn.lxh.blog.mapper.ParamMapper;
import cn.lxh.blog.query.ParamQuery;
import cn.lxh.blog.service.IParamService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


/**
 * ParamServiceImpl业务层类
 */
@Service // 该类交给spring管理
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS) // 将数据库设置成只读数据库, 此时若要进行写的操作, 会出现错误, 有事务就以事务方式执行, 没有事务就以非事务方式执行
public class ParamServiceImpl implements IParamService {

    @Autowired
    private ParamMapper paramMapper;

    /**
     * 查询所有参数
     *
     * @return
     */
    @Override
    public Map<String, Object> findAll() {
        // 查询所有参数
        List<Param> paramList = paramMapper.findAll();
        // 将list集合转为map集合
        Map<String, Object> map = paramList.stream().collect(Collectors.toMap(Param::getParamKey, Param::getParamValue));
        return map;
    }

    /**
     * 修改参数
     *
     * @param param
     */
    @Transactional // 开始事务
    @Override
    public void add(Param param) {
        paramMapper.add(param);
    }

    /**
     * 根据id删除参数
     *
     * @param id
     */
    @Transactional // 开始事务
    @Override
    public void delete(Long id) {
        paramMapper.delete(id);
    }

    /**
     * 修改参数
     *
     * @param param
     */
    @Transactional // 开始事务
    @Override
    public void update(Param param) {
        param.setUpdateTime(new Date());
        paramMapper.update(param);
    }

    /**
     * 根据id查询单个参数
     *
     * @param id
     * @return
     */
    @Override
    public Param findOne(Long id) {
        return paramMapper.findOne(id);
    }

    /**
     * 查询所有参数
     *
     * @return
     */
    @Override
    public List<Param> getAll() {
        return paramMapper.getAll();
    }

    /**
     * 根据id批量删除参数
     *
     * @param ids
     */
    @Transactional // 开始事务
    @Override
    public void patchDelete(Long[] ids) {
        paramMapper.patchDelete(ids);
    }

    /**
     * 分页查询
     *
     * @param paramQuery
     * @return
     */
    @Override
    public PageInfo<Param> queryPage(ParamQuery paramQuery) {
        // 开启分页, 它只对紧挨着下面的第一个查询所有的sql语句生效(1. 先查询总数量total 2. 根据application.yml中驱动名自动实现分页,如果是mysql就用limit
        // 3. 自动计算limit的第一个值: limit a, b
        PageHelper.startPage(paramQuery.getCurrentPage(), paramQuery.getPageSize());
        // 查询所有
        List<Param> list = paramMapper.queryPage(paramQuery);
        // 返回对象中有: list当前页分页数据和total总条数
        return new PageInfo<>(list);
    }
}
